package com.example.course.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.course.dto.ClassAssignDTO;
import com.example.course.dto.StudentDTO;
import com.example.course.dto.StudentQueryDTO;
import com.example.course.dto.StudentUpdateDTO;
import com.example.course.service.CoursesService;
import com.example.course.service.StudentService;
import com.example.course.tool.R;
import com.example.course.vo.StudentVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import com.example.course.dto.LoginDTO;
import com.example.course.vo.LoginVO;

import javax.validation.Valid;

/**
 * 学生控制器，处理与学生相关的HTTP请求
 *
 * @author Jasmine-drs
 * @date 2025/4/22 15:40
 */
@Slf4j
@RestController
@RequestMapping("/students")
@AllArgsConstructor
@Api(tags = "学生管理接口")
public class StudentController {
	private final StudentService studentService;
	private final CoursesService coursesService;

	/**
	 * 获取学生列表
	 *
	 * @param queryDTO 查询条件
	 * @return 学生列表
	 */
	@GetMapping
	@ApiOperation("获取学生列表")
	public R<Page<StudentVO>> getStudentList(@Valid StudentQueryDTO queryDTO) {
		log.info("请求获取学生列表：{}", queryDTO);

		try {
			// 调用服务层获取学生列表
			Page<StudentVO> page = studentService.getStudentList(queryDTO);
			return R.success(page);
		} catch (Exception e) {
			log.error("获取学生列表异常", e);
			return R.err("获取学生列表失败：" + e.getMessage());
		}
	}

	/**
	 * 获取学生详情
	 *
	 * @param id 学生ID
	 * @return 学生详情
	 */
	@GetMapping("/{id}")
	@ApiOperation("获取学生详情")
	public R<StudentVO> getStudentDetail(@ApiParam(value = "学生ID", required = true) @PathVariable Integer id) {
		log.info("请求获取学生详情，ID：{}", id);

		try {
			// 调用服务层获取学生详情
			StudentVO studentVO = studentService.getStudentById(id);
			return R.success(studentVO);
		} catch (IllegalArgumentException e) {
			log.warn("获取学生详情参数异常", e);
			return R.err(e.getMessage());
		} catch (Exception e) {
			log.error("获取学生详情异常", e);
			return R.err("获取学生详情失败：" + e.getMessage());
		}
	}

	/**
	 * 添加学生
	 *
	 * @param studentDTO 学生信息
	 * @return 添加结果
	 */
	@PostMapping
	@ApiOperation("添加学生")
	public R<StudentVO> addStudent(@ApiParam(value = "学生信息", required = true) @Valid @RequestBody StudentDTO studentDTO) {
		log.info("请求添加学生：{}", studentDTO);

		try {
			// 调用服务层添加学生
			StudentVO studentVO = studentService.addStudent(studentDTO);
			return R.success(studentVO);
		} catch (IllegalArgumentException e) {
			log.warn("添加学生参数异常", e);
			return R.err(e.getMessage());
		} catch (Exception e) {
			log.error("添加学生异常", e);
			return R.err("添加学生失败：" + e.getMessage());
		}
	}

	/**
	 * 删除学生
	 * 
	 * @param id 学生ID
	 * @return 删除结果
	 */
	@DeleteMapping("/{id}")
	@ApiOperation("删除学生")
	public R<Boolean> deleteStudent(@ApiParam(value = "学生ID", required = true) @PathVariable Integer id) {
		log.info("请求删除学生，ID：{}", id);

		try {
			// 调用服务层删除学生
			boolean result = studentService.deleteStudent(id);
			return R.success(result);
		} catch (IllegalArgumentException e) {
			log.warn("删除学生参数异常", e);
			return R.err(e.getMessage());
		} catch (Exception e) {
			log.error("删除学生异常", e);
			return R.err("删除学生失败：" + e.getMessage());
		}
	}

	/**
	 * 分配学生到班级
	 *
	 * @param id             学生ID
	 * @param classAssignDTO 班级分配信息
	 * @return 分配结果
	 */
	@PutMapping("/{id}/class")
	@ApiOperation("分配学生到班级")
	public R<StudentVO> assignStudentToClass(
			@ApiParam(value = "学生ID", required = true) @PathVariable Integer id,
			@ApiParam(value = "班级分配信息", required = true) @Valid @RequestBody ClassAssignDTO classAssignDTO) {
		log.info("请求分配学生到班级，学生ID：{}，班级ID：{}", id, classAssignDTO.getClassesId());

		try {
			// 调用服务层分配学生到班级
			StudentVO studentVO = studentService.assignStudentToClass(id, classAssignDTO.getClassesId());
			return R.success(studentVO);
		} catch (IllegalArgumentException e) {
			log.warn("分配学生到班级参数异常", e);
			return R.err(e.getMessage());
		} catch (Exception e) {
			log.error("分配学生到班级异常", e);
			return R.err("分配学生到班级失败：" + e.getMessage());
		}
	}

	/**
	 * 学生登录
	 *
	 * @param loginDTO 登录信息
	 * @return 登录结果
	 */
	@PostMapping("/login")
	@ApiOperation("学生登录")
	public R<LoginVO> login(@ApiParam(value = "登录信息", required = true) @Valid @RequestBody LoginDTO loginDTO) {
		log.info("请求学生登录，学号：{}", loginDTO.getStudentNum());

		try {
			// 调用服务层进行登录验证
			LoginVO loginVO = studentService.login(loginDTO);
			return R.success(loginVO);
		} catch (IllegalArgumentException e) {
			log.warn("学生登录参数异常", e);
			return R.err(e.getMessage());
		} catch (Exception e) {
			log.error("学生登录异常", e);
			return R.err("登录失败：" + e.getMessage());
		}
	}

	/**
	 * 更新学生信息（教师权限）
	 *
	 * @param id               学生ID
	 * @param studentUpdateDTO 学生更新信息
	 * @param userId           用户ID，用于身份验证
	 * @return 更新结果
	 */
	@PutMapping("/{id}")
	@ApiOperation("更新学生信息（教师权限）")
	public R<StudentVO> updateStudent(
			@ApiParam(value = "学生ID", required = true) @PathVariable Integer id,
			@ApiParam(value = "学生更新信息", required = true) @Valid @RequestBody StudentUpdateDTO studentUpdateDTO,
			@ApiParam(value = "用户ID", required = true) @RequestParam Integer userId) {
		log.info("请求更新学生信息，学生ID：{}，学生信息：{}，用户ID：{}", id, studentUpdateDTO, userId);

		try {
			// 检查用户是否为教师
			if (!coursesService.isTeacher(userId)) {
				return R.err("权限不足，只有教师可以更新学生信息");
			}

			// 调用服务层更新学生信息
			StudentVO studentVO = studentService.updateStudent(id, studentUpdateDTO);
			return R.success(studentVO);
		} catch (IllegalArgumentException e) {
			log.warn("更新学生信息参数异常", e);
			return R.err(e.getMessage());
		} catch (Exception e) {
			log.error("更新学生信息异常", e);
			return R.err("更新学生信息失败：" + e.getMessage());
		}
	}
}
